package Exercise;

public class EX05_OOP4 {


	public static void main(String[] args) {
		
		RetangleVO rv = new RetangleVO(4,40,"red");
		rv.getArea = RetangleService.getArea(rv.width, rv.height);
		System.out.println(rv.getArea);
		
		rv.getPerimeter = RetangleService.getPerimeter(rv.width, rv.height);
		System.out.println(rv.getPerimeter);
		System.out.println(rv.color);
		
		
		//FanVO fv = new  FanVO(10, "yellow", new FanVO() , true);
		FanVO fv = new  FanVO(10, "yellow", FanVO.FAST , true);
		System.out.println("\n");
		System.out.println("속도=" +fv.speed + "색깔=" + fv.color + "지름=" + fv.radius +FanService.toString(fv.on));
		
		System.out.println("\n");
		
		/*call by value(값에 의해 전달)
		* 메서드의 매개변수 유형이 기본 자료형인 경우
		* 기본 자료형 값을 메서드의 매개변수로 전달하면
		* JVM은 메서드의 지역변수에 그 값을 복사해줌
		* 따라서, 메서드의 지역변수 값을 변경하더라도,
		* 전달해준 변수에는 영향을 미치지는 않음
		*
		* 만일, 참조형 변수를 메서드의 매개변수로 전달하면
		* 지역변수는 참조형 변수가 전달해준 객체를
		* 가리키게 됨
		* 즉,참조형 변수에 저장된 값은 실제 값이 아니고
		* 그 값을 가리키는 주소를 의미하기 때문임
		* 따라서, 메서드에서 참조된 객체에 변경을 가하면
		* 그 변화는 호출된 코드에도 반영됨 
		*
		*/
		
	    AccountVO av = new AccountVO(1122, 20000, 4.5F, "20131108");
	    AccountService.withDraw(av, 2500);
	    System.out.println(av.balance);
	    // call by value
	    // 메서드의 매개변수 유형이 기본 자료형인 경우
	    
	    AccountService.deposit(av, 14000);
	    System.out.println(av.balance);
	    // call by reference		
	    // 메서드의 매개변수 유형이 참조 자료형인 경우
	    
	    
	    
	} // main

} // class

//VO,SERVICE

class RetangleVO{
float width = 1.0F;
float height = 1.0F;
String color ="white";
float getArea;
float getPerimeter;

public RetangleVO(){}
public RetangleVO(float width, float height,String color){
	this.width = width;
	this.height = height;
	this.color = color;
	
}
}

class RetangleService{
	static float getArea(float width, float height){
		return width * height;
	}
	static float getPerimeter(float width, float height){
		return 2* width + 2 * height;
	}
}

class FanVO{
	/* 속도를 나타내는 상수들은
	 * 객체 생성없이 바로 사용 가능해야 함
	 * 따라서, static final 예약어를 사용함
	 * 한편, JDK5 이상에서는 이것을 대체하기 위해
	 * Enum 이라는 새로운 클래스 자료형이 추가됨 */
	
	static final int SLOW = 1;
	static final int MEDIUM = 2;
	static final int FAST = 3;
	int speed;
	boolean on;
	float radius;
	String color = "blue";
	
	
	public FanVO(){}
	public FanVO(float radius, String color, int speed, boolean on){
		this.radius = radius;
		this.color = color;
		this.on = on;
		this.speed = speed;
		
	}

	
}

class FanService{
	// 메서드 다중정의 overloading
	// 메서드 서명만 다르면 
	// 메서드 이름은 동일하게 작성 가능 
	static String toString(boolean on)
	{
		if ( on ) { return "true"; } else{ return "false"; }
	}
		
}

class AccountVO{
 int aid;
 int balance;
 float interestRate;
 String dateCreated;
 int money;
 
   public AccountVO(){
	  aid = 0;
	  balance = 0;
	  interestRate = 0;
   }
   public AccountVO(int aid, int balance, float interestRate, String dateCreated){
	  this.aid = aid;
	  this.balance = balance;
	  this.interestRate = interestRate;
	  this.dateCreated = dateCreated;
	  
	  }
	
}

class AccountService{
	static float getMonthly(float interestRate){
		return interestRate / 12;
	}
	static int withDraw(int z,int x){
		z -= x;
		System.out.println("인출 후 잔액 :" + z);
		return z;
	}
	static int withDraw(AccountVO av, int money){
		 av.balance -= money;	System.out.println("인출 후 잔액 :" + av.balance);
		 return av.balance;
	}
	static int deposit(AccountVO av, int money){
		 av.balance += money; System.out.println("입금 후 잔액 :" + av.balance); 
		 return av.balance;
	}
	
}

class StockVO{
	String sname;
	float previous;
	float current;
	
	
}

class StockService{
	
}